﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using MySql.Data.MySqlClient;

//ExecuteNonQuery: Used to execute a command that will not return any data, for example Insert, update or delete.
//ExecuteReader: Used to execute a command that will return 0 or more records, for example Select.
//ExecuteScalar: Used to execute a command that will return only 1 value, for example Select Count(*).

namespace CapaNegocio
{
    public class clsUsuario
    {
        //DATOS DEL USUARIO QUE INICIÓ SESIÓN
        public int      codLogueado { get; set; }
        public string   usuLogueado { get; set; }
        public string   conLogueado { get; set; }
        public string   nomLogueado { get; set; }
        public string   patLogueado { get; set; }
        public string   matLogueado { get; set; }
        public string   dniLogueado { get; set; }
        public string   nacLogueado { get; set; }
        public int      sexLogueado { get; set; }
        public string   emaLogueado { get; set; }
        public string   dirLogueado { get; set; }
        public string   fijLogueado { get; set; }
        public string   movLogueado { get; set; }
        public int      estLogueado { get; set; }
        public string   creLogueado { get; set; }
        public string   modLogueado { get; set; }
        public int      tipLogueado { get; set; }
        public string   tusLogueado { get; set; }

        //TABLA: Usuario
        public int      codigoUsuario           { get; set; }
        public string   usuarioUsuario          { get; set; }
        public string   contraseniaUsuario      { get; set; }
        public string   nombreUsuario           { get; set; }
        public string   apepaternoUsuario       { get; set; }
        public string   apematernoUsuario       { get; set; }
        public string   dniUsuario              { get; set; }
        public string   fecnacimientoUsuario    { get; set; }
        public int      sexoUsuario             { get; set; }
        public string   emailUsuario            { get; set; }
        public string   direccionUsuario        { get; set; }
        public string   telfijoUsuario          { get; set; }
        public string   telmovilUsuario         { get; set; }
        public int      estadoUsuario           { get; set; }
        public DateTime feccreacionUsuario      { get; set; }
        public int      tipoUsuario             { get; set; }
        public String   contrasenianuevaUsuario { get; set; } //Variable de la clase, no existe en la base de datos

        //TABLA: Usuario Tipo
        public int      codigoUsuarioTipo       { get; set; }
        public string   tipoUsuarioTipo         { get; set; }
        public string   descripcionUsuarioTipo  { get; set; }
        public int      totaltipoUsuarioTipo    { get; set; } //Variable creada en la CLS, no existe en BD

        //TABLA: Auditoria
        public int      codigoAuditoria         { get; set; }
        public string   usuarioAuditoria        { get; set; }
        public DateTime fechaAuditoria          { get; set; }
        public string   ipAuditoria             { get; set; }
        public string   pcAuditoria             { get; set; }
        public string   usuariopcAuditoria      { get; set; }
        public string   procalmacenadoAuditoria { get; set; }
        public string   accionAuditoria         { get; set; }
        public string   tablaAuditoria          { get; set; }
        public string   campoAuditoria          { get; set; }
        public string   valantiguoAuditoria     { get; set; }
        public string   valnuevoAuditoria       { get; set; }

        public clsBoleta clsBoleta
        {
            get
            {
                throw new System.NotImplementedException();
            }
            set
            {
            }
        }
        

        //mtdCrearUsuario() -> Administracion
        public bool mtdCrearUsuario(){
            clsConexion     con = new clsConexion();
            MySqlCommand    command;
            MySqlDataReader Reader;

            String usuario          = null;
            String contrasenia      = null;
            String nombre           = null;
            String apepaterno       = null;
            String apematerno       = null;
            String dni              = null;
            String fecnacimiento    = null;
            Int32  tipousuario      = 0;
            String usuariologueado  = null;
            String ip               = null;
            String pc               = null;
            String usuariopc        = null;
            String procalmacenado   = null;
            String campos           = null;
            String valantiguos      = null;
            String valnuevos        = null;
            
            try {
                con.mtdConectar();
                command = con.conexion.CreateCommand();
                
                usuario         = this.usuarioUsuario;
                contrasenia     = this.contraseniaUsuario;
                nombre          = this.nombreUsuario;
                apepaterno      = this.apepaternoUsuario;
                apematerno      = this.apematernoUsuario;
                dni             = this.dniUsuario;
                fecnacimiento   = this.fecnacimientoUsuario;
                tipousuario     = this.tipoUsuario;
                usuariologueado = this.usuLogueado;
                ip              = this.ipAuditoria;
                pc              = this.pcAuditoria;
                usuariopc       = this.usuariopcAuditoria;
                procalmacenado  = "spCrearUsuario";
                campos          = this.campoAuditoria;
                valantiguos     = this.valantiguoAuditoria;
                valnuevos       = this.valnuevoAuditoria;

                if ((usuario != "") && (nombre != "") && (apepaterno != "") && (apematerno != "")){
                    command.CommandText = "CALL spCrearUsuario('" 
                                            + usuario + "','" + contrasenia + "','" + nombre + "','" 
                                            + apepaterno + "','" + apematerno + "','" + dni + "','" 
                                            + fecnacimiento + "','" + tipousuario + "','" + usuariologueado + "','"
                                            + ip + "','" + pc + "','" + usuariopc + "','" + procalmacenado + "','" 
                                            + campos + "','" + valantiguos + "','" + valnuevos + "');";
                    Reader = command.ExecuteReader();
                    return true;
                } else{
                    System.Windows.Forms.MessageBox.Show("Imposible crear usuario, los campos necesarios estan vacios.");
                    return false;
                }
                con.mtdDesconectar();
                //System.Windows.Forms.MessageBox.Show("Imposible crear usuario.");
            } catch (Exception ex){
                System.Windows.Forms.MessageBox.Show("El nombre de usuario o dni que ha intentado ingresar ya existe");
                return false;
                //throw ex;
                //System.Windows.Forms.MessageBox.Show("NO");
            }
        }

        //mtdModificarUsuario() -> Administracion
        public bool mtdModificarUsuario(){
            clsConexion     con = new clsConexion();
            MySqlCommand    command;
            MySqlDataReader Reader;

            String usuario          = null;
            String contrasenia      = null;
            String nombre           = null;
            String apepaterno       = null;
            String apematerno       = null;
            String dni              = null;
            String fecnacimiento    = null;
            Int32  estadousuario    ;
            Int32  tipousuario      ;
            String usuariologueado  = null;
            String ip               = null;
            String pc               = null;
            String usuariopc        = null;
            String procalmacenado   = null;
            String campos           = null;
            String valantiguos      = null;
            String valnuevos        = null;
            
            try{
                con.mtdConectar();
                command = con.conexion.CreateCommand();

                usuario         = this.usuarioUsuario;
                contrasenia     = this.contraseniaUsuario;
                nombre          = this.nombreUsuario;
                apepaterno      = this.apepaternoUsuario;
                apematerno      = this.apematernoUsuario;
                dni             = this.dniUsuario;
                fecnacimiento   = this.fecnacimientoUsuario;
                estadousuario   = this.estadoUsuario;
                tipousuario     = this.tipoUsuario;
                usuariologueado = this.usuLogueado;
                ip              = this.ipAuditoria;
                pc              = this.pcAuditoria;
                usuariopc       = this.usuariopcAuditoria;
                procalmacenado  = "spModificarUsuario";
                campos          = this.campoAuditoria;
                valantiguos     = this.valantiguoAuditoria;
                valnuevos       = this.valnuevoAuditoria;

                if ((usuario != "") && (nombre != "") && (apepaterno != "") && (apematerno != "")){
                    command.CommandText = "CALL spModificarUsuario('" 
                                            + usuario + "','" + contrasenia + "','" + nombre + "','"
                                            + apepaterno + "','" + apematerno + "','" + dni + "','"
                                            + fecnacimiento + "','" + estadousuario + "','" + tipousuario + "','" 
                                            + usuariologueado + "','" + ip + "','" + pc + "','"
                                            + usuariopc + "','" + procalmacenado + "','" + campos + "','"
                                            + valantiguos + "','" + valnuevos + "');";
                    Reader = command.ExecuteReader();
                    return true;
                } else{
                    System.Windows.Forms.MessageBox.Show("Imposible modificar usuario, los datos necesarios estan vacios.");
                    return false;
                }
                con.mtdDesconectar();
                //System.Windows.Forms.MessageBox.Show("Imposible crear usuario.");
            } catch (Exception ex){
                //return false;
                throw ex;
                //System.Windows.Forms.MessageBox.Show("NO");
            }
        }

        //mtdModificarPerfilBasico() -> Usuario
        public bool mtdModificarPerfilBasico(){
            clsConexion con = new clsConexion();
            ////con.cadenaconexionx = this.cadena;
            MySqlCommand command;
            String usuario = null;
            String nombre = null;
            String paterno = null;
            String materno = null;
            String dni = null;
            String nacimiento = null;
            String usuariologueado = null;
            String ip = null;
            String pc = null;
            String usuariopc = null;
            String procalmacenado = null;
            String campos = null;
            String valantiguos = null;
            String valnuevos = null;
            MySqlDataReader Reader;

            try{
                con.mtdConectar();
                command = con.conexion.CreateCommand();

                usuario = this.usuarioUsuario;
                nombre = this.nombreUsuario;
                paterno = this.apepaternoUsuario;
                materno = this.apematernoUsuario;
                dni = this.dniUsuario;
                nacimiento = this.fecnacimientoUsuario;
                usuariologueado = this.usuLogueado;
                ip = this.ipAuditoria;
                pc = this.pcAuditoria;
                usuariopc = this.usuariopcAuditoria;
                procalmacenado = "spModificarPerfilBasico";
                campos = this.campoAuditoria;
                valantiguos = this.valantiguoAuditoria;
                valnuevos = this.valnuevoAuditoria;

                if ((usuario != "") && (nombre != "") && (paterno != "") && (materno != "")){
                    command.CommandText = "CALL spModificarPerfilBasico('" 
                                            + usuario + "','" + nombre + "','" + paterno + "','" 
                                            + materno + "','" + dni + "','" + nacimiento + "','" 
                                            + usuariologueado + "','" + ip + "','" + pc + "','"
                                            + usuariopc + "','" + procalmacenado + "','" + campos + "','" 
                                            + valantiguos + "','" + valnuevos + "');";
                    Reader = command.ExecuteReader();
                    return true;
                } else{
                    System.Windows.Forms.MessageBox.Show("Imposible modificar usuario, los datos necesarios estan vacios.");
                    return false;
                }
                con.mtdDesconectar();
            }
            catch (Exception ex){
                return false;
                throw ex;
                //System.Windows.Forms.MessageBox.Show("NO");
            }
        }

        //mtdModificarPerfilAvanzado() -> Perfil
        public bool mtdModificarPerfilAvanzado(){
            clsConexion     con = new clsConexion();
            MySqlCommand    command;
            MySqlDataReader Reader;

            String usuario          = null;
            Int32  sexo             ;
            String email            = null;
            String direccion        = null;
            String fijo             = null;
            String movil            = null;
            String usuariologueado  = null;
            String ip               = null;
            String pc               = null;
            String usuariopc        = null;
            String procalmacenado   = null;
            String campos           = null;
            String valantiguos      = null;
            String valnuevos        = null;

            try{
                con.mtdConectar();
                command = con.conexion.CreateCommand();

                usuario         = this.usuarioUsuario;
                sexo            = this.sexoUsuario;
                email           = this.emailUsuario;
                direccion       = this.direccionUsuario;
                fijo            = this.telfijoUsuario;
                movil           = this.telmovilUsuario;
                usuariologueado = this.usuarioUsuario;
                ip              = this.ipAuditoria;
                pc              = this.pcAuditoria;
                usuariopc       = this.usuariopcAuditoria;
                procalmacenado  = "spModificarPerfilAvanzado";
                campos          = this.campoAuditoria;
                valantiguos     = this.valantiguoAuditoria;
                valnuevos       = this.valnuevoAuditoria;

                if (usuario != ""){
                    command.CommandText = "CALL spModificarPerfilAvanzado('" + usuario + "'," + sexo + ",'" + email + "','"
                                            + direccion + "','" + fijo + "','" + movil + "','"
                                            + usuariologueado + "','" + ip + "','" + pc + "','"
                                            + usuariopc + "','" + procalmacenado + "','" + campos + "','"
                                            + valantiguos + "','" + valnuevos + "');";
                    Reader = command.ExecuteReader();
                    return true;
                } else{
                    System.Windows.Forms.MessageBox.Show("Imposible modificar usuario, los datos necesarios estan vacios.");
                    return false;
                }
                con.mtdDesconectar();
            } catch (Exception ex){
                return false;
                throw ex;
            }
        }

        //mtdModificarPerfilContraseña() -> Perfil
        public bool mtdModificarPerfilContraseña(){
            clsConexion con = new clsConexion();
            ////con.cadenaconexionx = this.cadena;
            MySqlCommand command;
            String usuario = null;
            String contraseniaActual = null;
            String contraseniaNueva = null;
            String usuarioLogueado = null;
            String ip = null;
            String pc = null;
            String usuariopc = null;
            String procalmacenado = null;
            String campos = null;
            String valantiguos = null;
            String valnuevos = null;
            MySqlDataReader Reader;

            try{
                con.mtdConectar();
                command = con.conexion.CreateCommand();
                
                usuario             = this.usuarioUsuario;
                contraseniaActual   = this.contraseniaUsuario;
                contraseniaNueva    = this.contrasenianuevaUsuario;
                usuarioLogueado     = this.usuarioUsuario;
                ip                  = this.ipAuditoria;
                pc                  = this.pcAuditoria;
                usuariopc           = this.usuariopcAuditoria;
                procalmacenado      = "spModificarPerfilContraseña";
                campos              = this.campoAuditoria;
                valantiguos         = this.valantiguoAuditoria;
                valnuevos           = this.valnuevoAuditoria;

                if ((usuario != "") && (contraseniaActual != "") && (contraseniaNueva != "")){
                    command.CommandText = "CALL spModificarPerfilContraseña('" 
                                            + usuario + "','" + contraseniaActual + "','" + contraseniaNueva + "','"
                                            + usuarioLogueado + "','" + ip + "','" + pc + "','"
                                            + usuariopc + "','" + procalmacenado + "','" + campos + "','"
                                            + valantiguos + "','" + valnuevos + "');";
                    Reader = command.ExecuteReader();
                    return true;
                } else{
                    System.Windows.Forms.MessageBox.Show("Imposible actualizar la contraseña, los datos necesarios estan vacios.");
                    return false;
                }
                con.mtdDesconectar();
            } catch (Exception ex){
                return false;
                throw ex;
            }
        }

        //mtdBuscarUsuario() -> Administracion
        public bool mtdBuscarUsuario(){
            clsConexion     con = new clsConexion();
            MySqlCommand    command;
            MySqlDataReader Reader;
            String usuario = null;

            try{
                con.mtdConectar();
                command = con.conexion.CreateCommand();

                usuario = this.usuarioUsuario;
 
                if (usuario != ""){
                    command.CommandText = "CALL spBuscarUsuario('" + usuario + "');";
                    Reader = command.ExecuteReader();
                    if (Reader.Read()){
                        this.contraseniaUsuario = Reader.GetString(2);
                        this.nombreUsuario = Reader.GetString(3);
                        this.apepaternoUsuario = Reader.GetString(4);
                        this.apematernoUsuario = Reader.GetString(5);
                        this.dniUsuario = Reader.GetString(6);
                        this.fecnacimientoUsuario = Reader.GetDateTime(7).ToShortDateString();
                        this.estadoUsuario = Reader.GetInt16(13);
                        this.codigoUsuarioTipo = Reader.GetInt16(16);
                        this.tipoUsuarioTipo = Reader.GetString(17);
                    } else{
                        System.Windows.Forms.MessageBox.Show("El usuario no existe.");
                        return false;
                    }
                } else{
                    System.Windows.Forms.MessageBox.Show("Imposible buscar usuario. El campo necesario esta vacio.");
                    return false;
                }
                con.mtdDesconectar();
                return true;
            } catch (Exception ex){
                return false;
                throw ex;
            }
        }

        //mtdTipoUsuario()
        public DataSet mtdTipoUsuario(){
            clsConexion         con             = new clsConexion();
            MySqlCommand        command;
            MySqlCommand        command2;
            MySqlDataAdapter    objDataAdapter  = new MySqlDataAdapter();
            DataSet             objDataSet      = new DataSet();

            try{
                con.mtdConectar();
                //Total de Tipos de Usuario
                command = con.conexion.CreateCommand();
                command.CommandText = "SELECT COUNT(*) FROM UsuarioTipo;";
                this.totaltipoUsuarioTipo = int.Parse(command.ExecuteScalar() + "");

                //Registro de los Tipos de Usuario
                command2 = con.conexion.CreateCommand();
                command2.CommandText = "CALL spTipoUsuario();"; //"SELECT codigo_UsuarioTipo, tipo_UsuarioTipo, descripcion_UsuarioTipo FROM UsuarioTIPO;";
                command2.ExecuteNonQuery();

                objDataAdapter.SelectCommand = command2;
                objDataAdapter.Fill(objDataSet, "UsuarioTipo");
                return objDataSet;
                //con.mtdDesconectar();
            } catch (Exception){
                throw new Exception("Imposible listar los tipos de usuario.");
            }
        }

        //Metodo ListarTodoTipoUsuario()
        public DataTable mtdListarTodoTipoUsuario(){
            clsConexion         con             = new clsConexion();
            MySqlCommand        command;
            DataTable           objDataTable    = new DataTable();
            DataSet             objDataSet      = new DataSet();
            MySqlDataAdapter    objDataAdapter  = new MySqlDataAdapter();
            
            try{
                con.mtdConectar();
                command = con.conexion.CreateCommand();

                //Llamamos al Store Procedure
                command.CommandText = "CALL spListarTodoTipoUsuario();";
                //Ejecutamos el DataAdapter con el Store Procedure
                command.ExecuteNonQuery();
                //Llenamos el DataTable con los resultados del Store Procedure
                objDataAdapter.SelectCommand = command;
                objDataAdapter.Fill(objDataTable);

                con.mtdDesconectar();
                objDataAdapter = null;
                return objDataTable;
            } catch (Exception ex){
                //return false;
                throw ex;
            }
        }

        //Metodo ListarTipoUsuario()
        public DataTable mtdListarTipoUsuario()
        {
            clsConexion con                 = new clsConexion();
            MySqlCommand command;
            DataTable objDataTable          = new DataTable();
            DataSet objDataSet              = new DataSet();
            MySqlDataAdapter objDataAdapter = new MySqlDataAdapter();

            Int32 tipoUser;
            try
            {
                con.mtdConectar();
                command = con.conexion.CreateCommand();

                tipoUser= this.tipoUsuario;

                if (tipoUser > 0)
                {
                    //Llamamos al Store Procedure
                    command.CommandText = "CALL spListarTipoUsuario(" + tipoUser + ");";
                    //Ejecutamos el DataAdapter con el Store Procedure
                    command.ExecuteNonQuery();
                    //Llenamos el DataTable con los resultados del Store Procedure
                    objDataAdapter.SelectCommand = command;
                    objDataAdapter.Fill(objDataTable);
                }
                else
                {
                    System.Windows.Forms.MessageBox.Show("Imposible listar los usuarios, no existen categorias para listar.");
                }
                con.mtdDesconectar();
                objDataAdapter = null;
                return objDataTable;
            }
            catch (Exception ex)
            {
                //return false;
                throw ex;
            }
        }

        //mtdIniciarSesion()
        public bool mtdIniciarSesion(){
            clsConexion con = new clsConexion();
            //con.cadenaconexionx = this.cadena;
            MySqlCommand command;
            MySqlDataReader Reader;
            String usuario = null;
            String contrasenia = null;
            String ip = null;
            String pc = null;
            String usuariopc = null;
            String procalmacenado = null;

            try{
                con.mtdConectar();
                command = con.conexion.CreateCommand();
                usuario = this.usuarioUsuario;
                contrasenia = this.contraseniaUsuario;
                ip = this.ipAuditoria;
                pc = this.pcAuditoria;
                usuariopc = this.usuariopcAuditoria;
                procalmacenado = "spInicioSesion";

                if (usuario != ""){
                    if (contrasenia != ""){
                        command.CommandText = "CALL spInicioSesion('" + usuario + "','" + contrasenia + "','" + ip + "','" + pc + "','" + usuariopc + "','" + procalmacenado + "');";
                        Reader = command.ExecuteReader();
                        while (Reader.Read()){
                            this.usuarioUsuario = Reader.GetString(1);
                            this.contraseniaUsuario = Reader.GetString(2);
                            this.estadoUsuario = Reader.GetInt16(13);
                            this.codigoUsuarioTipo = Reader.GetInt16(16);
                            this.tipoUsuarioTipo = Reader.GetString(17);
                            // DATOS DEL USUARIO QUE INICIÓ SESIÓN
                            this.codLogueado = Reader.GetInt16(0);
                            this.usuLogueado = Reader.GetString(1);
                            this.conLogueado = Reader.GetString(2);
                            this.nomLogueado = Reader.GetString(3);
                            this.patLogueado = Reader.GetString(4);
                            this.matLogueado = Reader.GetString(5);
                            this.dniLogueado = Reader.GetString(6);
                            this.nacLogueado = Reader.GetString(7);
                            this.sexLogueado = Reader.GetInt16(8);
                            this.emaLogueado = Reader.GetString(9);
                            this.dirLogueado = Reader.GetString(10);
                            this.fijLogueado = Reader.GetString(11);
                            this.movLogueado = Reader.GetString(12);
                            this.estLogueado = Reader.GetInt16(13);
                            this.creLogueado = Reader.GetString(14);
                            this.modLogueado = Reader.GetString(15);
                            this.tipLogueado = Reader.GetInt16(16);
                            this.tusLogueado = Reader.GetString(17);

                            if (this.estadoUsuario == 1){
                                if (this.usuarioUsuario.Equals(usuario) && this.contraseniaUsuario.Equals(contrasenia)){
                                    System.Windows.Forms.MessageBox.Show("Bienvenido a iLab");
                                    return true;
                                }
                                //else
                                //{
                                //    System.Windows.Forms.MessageBox.Show("El usuario y la contraseña ingresada no coinciden");

                                //    //return false;
                                //}
                            } else{
                                System.Windows.Forms.MessageBox.Show("Usuario deshabilitado.");
                            }
                        }
                    }
                }
                con.mtdDesconectar();
                System.Windows.Forms.MessageBox.Show("Usuario o contraseña incorrecta.");
                return false;
            } catch (Exception ex){
                //return false;
                throw ex;
                //System.Windows.Forms.MessageBox.Show("NO");
            }
        }
    }
}